// 版权所有20092010 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// OpenBSD系统调用。
// 该文件被编译为普通的Go代码，
// 但它也是mksyscall的输入，
// 它解析
// 请注意，有时我们使用小写
// syscall_bsd中。go或syscall_unix。去通过二进制搜索执行查找。org/issue/5847 

package syscall

import "unsafe"

type SockaddrDatalink struct {
	Len    uint8
	Family uint8
	Index  uint16
	Type   uint8
	Nlen   uint8
	Alen   uint8
	Slen   uint8
	Data   [24]int8
	raw    RawSockaddrDatalink
}

func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)

func nametomib(name string) (mib []_C_int, err error) {
	left := 0
	right := len(sysctlMib) - 1
	for {
		idx := left + (right-left)/2
		switch {
		case name == sysctlMib[idx].ctlname:
			return sysctlMib[idx].ctloid, nil
		case name > sysctlMib[idx].ctlname:
			left = idx + 1
		default:
			right = idx - 1
		}
		if left > right {
			break
		}
	}
	return nil, EINVAL
}

func direntIno(buf []byte) (uint64, bool) {
	return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))
}

func direntReclen(buf []byte) (uint64, bool) {
	return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
}

func direntNamlen(buf []byte) (uint64, bool) {
	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
}

func Pipe(p []int) error {
	return Pipe2(p, 0)
}

func Pipe2(p []int, flags int) error {
	if len(p) != 2 {
		return EINVAL
	}
	var pp [2]_C_int
	err := pipe2(&pp, flags)
	if err == nil {
		p[0] = int(pp[0])
		p[1] = int(pp[1])
	}
	return err
}

func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
	var rsa RawSockaddrAny
	var len _Socklen = SizeofSockaddrAny
	nfd, err = accept4(fd, &rsa, &len, flags)
	if err != nil {
		return
	}
	if len > SizeofSockaddrAny {
		panic("RawSockaddrAny too small")
	}
	sa, err = anyToSockaddr(&rsa)
	if err != nil {
		Close(nfd)
		nfd = 0
	}
	return
}

func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
	return getdents(fd, buf)
}

func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
	return -1, ENOSYS
}

func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
	var _p0 unsafe.Pointer
	var bufsize uintptr
	if len(buf) > 0 {
		_p0 = unsafe.Pointer(&buf[0])
		bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
	}
	r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
	n = int(r0)
	if e1 != 0 {
		err = e1
	}
	return
}

/*
 * Exposed directly
 */
// sys Access（路径字符串，模式uint32）（错误）
// sys Adjtime（delta*Timeval，olddta*Timeval）（错误）
// sys Chdir（路径字符串）（错误）
// sys Chflags（路径字符串，标志int）（错误）
// sys Chroot（路径字符串）（错误）
// sys Close（fd int）（错误）
// sys Dup（fd int）（nfd int，err err error）
// sys Fchown（fd int，uid int，gid int）（error error）
// sys Ftruncate（fd int，length int64）（error error）
// sysnb Getegid（）（egid int）
// sysnb Getppid（）（ppid int）
// sys Getpriority（who int，who int）（prio int，error error）
// sysnb Getrlimit（who int，lim*Rlimit）（error error）
// sys Issetugid（）（污染bool）
// sys Kill（pid int，signum Signal）（error error）
// sys Kqueue（）（fd int，error）
// sys Lchown（路径字符串，uid int，gid int）（error error）
// sys Mkdir（路径字符串，stat*stat_t）（错误）
// sys Mkdir（路径字符串，模式uint32）（错误）
// sys Mkfifo（路径字符串，模式uint32）（错误）
// sys NANOEP（时间*时间间隔，剩余时间间隔）（错误）
// sys Pathconf（路径字符串，名称int）（val int，error error）
// sys Pread（fd int，p[]字节，偏移量int64）（n int，error error）
// sys Rename（从字符串到字符串）（error error）
// sys Revoke（路径字符串）（error error）
// sys Rmdir（路径字符串）（error error）
// sys Select（n int，r*FdSet，w*FdSet，e*FdSet，Timeval）（error）
// sysnb Setgid（gid int）（error）
// sys Setlogin（name string）（error error）
// sysnb Setpgid（pid int，pgid int）（error error）
// sys Setpriority（who int，who int，prio int）（error error）
// sysnb Setregid（ruid int，euid int）（err error）
// sysnb Setrlimit（which int，lim*Rlimit）（error error）
// sysnb setid（）（pid int，error error）
// sysnb Settimeofday（tp*Timeval）（error error）
// sysnb Setuid（uid int）（error）
// sys Stat（path string，Stat*Stat__t）（error error）
// sys Symlink（path string，link string，link string，link string）（error）
// sys Umask（newmask int）（oldmak int）
// sys Unlink（路径字符串）（错误）
// sys Unmount（路径字符串，标志int）（错误）
// sys write（fd int，p[]字节）（n int，错误）
// sys mmap（addr uintptpr，length uintptpr，prot，flag int，flag int，fd int，pos int64）（ret uintptr，err error）
// sys munmap（addr uintptr，length uintptr）（err error）
// sys utimensat（dirfd int，path string，times*[2]Timespec，flag int）（err err error）
